﻿using Microsoft.Extensions.AI;
using OpenAI;
using System.ClientModel;

namespace OpenAi.Demo.ConsoleApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            RunAsync().Wait();
        }

        private static async Task TestConnection(OpenAIClient client, string model)
        {
            try
            {
                // 发送一个简单的测试消息
                IChatClient testChatClient = client.GetChatClient(model).AsIChatClient();
                var testMessages = new List<ChatMessage>
                {
                    new ChatMessage(ChatRole.User, "你好，这是一个测试。如果收到请返回测试成功！.")
                };

                Console.WriteLine("发送测试消息 (流式)...");
                string testResponse = "";
                int responseCount = 0;
                await foreach (var item in testChatClient.GetStreamingResponseAsync(testMessages))
                {
                    responseCount++;
                    //Console.WriteLine($"[调试] 收到响应片段 #{responseCount}: '{item.Text}' (长度: {item.Text?.Length ?? 0})");
                    Console.Write(item.Text);
                    testResponse += item.Text;
                }

                Console.WriteLine($"[调试] 总共收到 {responseCount} 个响应片段");

                // 如果流式响应为空，尝试非流式请求
                if (string.IsNullOrEmpty(testResponse.Trim()) && responseCount == 0)
                {
                    Console.WriteLine("流式响应为空，尝试非流式请求...");
                    try
                    {
                        // 注意：这里可能需要不同的API调用方法
                        // 如果没有合适的非流式方法，这部分可能会出错，但不影响流式测试
                        Console.WriteLine("当前SDK可能不支持非流式调用，继续使用流式方式");
                    }
                    catch
                    {
                        Console.WriteLine("非流式测试跳过");
                    }
                }

                Console.WriteLine("✅ API连接测试成功！");
                if (string.IsNullOrEmpty(testResponse.Trim()))
                {
                    Console.WriteLine("⚠️  警告: 测试响应为空，但API连接正常");
                    Console.WriteLine("可能的原因：");
                    Console.WriteLine("- 模型返回空响应");
                    Console.WriteLine("- 流式响应格式不匹配");
                    Console.WriteLine("- API配置问题");
                }
                else
                {
                    Console.WriteLine("测试响应: " + testResponse.Trim());
                }
                Console.WriteLine("".PadRight(50, '-'));
            }
            catch (Exception ex)
            {
                Console.WriteLine("❌ API连接测试失败！");
                Console.WriteLine("错误详情: " + ex.Message);
                Console.WriteLine("请检查：");
                Console.WriteLine("1. API Key是否正确");
                Console.WriteLine("2. 网络连接是否正常");
                Console.WriteLine("3. API服务端点是否可用");
                Console.WriteLine("4. 模型名称是否正确: " + model);
                throw; // 重新抛出异常，停止程序执行
            }
        }

        private static async Task RunAsync()
        {
            string model = "gemma3:27b"; // 根据API文档使用正确的模型名称
            //string model = "deepseek-r1:32b";
            string key = "sk-aJPuHxJbJ4aP0MVwYeTZTwomARkRGlE3oItaDA6VJhPajx3k";

            try
            {
                ApiKeyCredential apiKeyCredential = new ApiKeyCredential(key);
                OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions()
                {
                    Endpoint = new Uri("https://oneapi.int.rclabenv.com/v1")
                };
                OpenAIClient openAIClient =
                    new OpenAIClient(apiKeyCredential, openAIClientOptions);
                var openAiModel = openAIClient.GetOpenAIModelClient();

                // 测试连接
                Console.WriteLine("正在测试API连接...");
                await TestConnection(openAIClient, model);

                // Create the IChatClient
                IChatClient chatClient = openAIClient.GetChatClient(model).AsIChatClient();
                List<ChatMessage> chatHistory =
        [
            new ChatMessage(ChatRole.System, """
            你是一位友好的万事通，你可以回答各种问题，提供信息和建议。
            回答要求：
            1. 语言使用中文。
            2. 回答内容要简洁明了，避免冗长。
            3. 如果不确定答案，可以说“我不太确定，但我会尽力帮助你”。
            4. 避免使用专业术语，确保普通人也能理解。
            5. 如果问题涉及敏感内容，请礼貌地拒绝回答，并告诉原因。
            6. 如果用户询问你的身份，你可以说：“我是一个AI助手，旨在帮助你解答问题和提供信息。”，如果可以清提供模型信息和版本信息。
        """)
        ];
                // Loop to get user input and stream AI response
                while (true)
                {
                    // Get user prompt and add to chat history
                    Console.WriteLine("Your prompt:");
                    string? userPrompt = Console.ReadLine();
                    chatHistory.Add(new ChatMessage(ChatRole.User, userPrompt));

                    // Stream the AI response and add to chat history
                    Console.WriteLine("AI Response:");
                    string response = "";
                    await foreach (ChatResponseUpdate item in chatClient.GetStreamingResponseAsync(chatHistory))
                    {
                        Console.Write(item.Text);
                        response += item.Text;
                    }
                    chatHistory.Add(new ChatMessage(ChatRole.Assistant, response));
                    Console.WriteLine();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("程序执行出错：" + ex.Message);
                Console.WriteLine("按任意键退出...");
                Console.ReadKey();
            }
        }
    }
}